﻿#pragma once

//#include <iostream>
//
//using namespace std;

//const int N = 35;
//
//int st[N];
//
//class Solution
//{
//public:
//
//	int dfs(int n)
//	{
//		if (st[n] != -1)
//		{
//			return st[n];
//		}
//
//		if (n == 1 || n == 0)
//		{
//			return n;
//		}
//
//		st[n] = dfs(n - 1) + dfs(n - 2);
//		return st[n];
//
//	}
//
//	int fib(int n)
//	{
//		memset(st, -1, sizeof st);
//		return dfs(n);
//	}
//};
//
//int main()
//{
//	Solution s;
//	cout << s.fib(4) << endl;
//
//	return 0;
//}


//#include <iostream>
//
//using namespace std;
//
//const int N = 15;
//
//int n;
//bool st[N];
//int t[N], d[N], l[N];
//
//
//bool dfs(int pos, int end)
//{
//	if (pos > n)
//	{
//		return true;
//	}
//
//	for (int i = 1; i <= n; i++)
//	{
//		if (st[i]) continue;
//		if (end > t[i] + d[i]) continue;
//
//		int newend = max(end, t[i]) + l[i];
//		st[i] = true;
//		if (dfs(pos + 1, newend)) return true;
//		st[i] = false;
//	}
//
//	return false;
//}
//
//int main()
//{
//	int T;
//	cin >> T;
//	while (T--)
//	{
//      多组测试数据的时候，⼀定要注意清空数据 
//		memset(st, 0, sizeof st);
//		cin >> n;
//		for (int i = 1; i <= n; i++)
//		{
//			cin >> t[i] >> d[i] >> l[i];
//		}
//
//		if (dfs(1, 0))
//		{
//			cout << "YES" << endl;
//		}
//		else
//		{
//			cout << "NO" << endl;
//		}
//	}
//
//	return 0;
//}

//八皇后
//#include <iostream>
//#include <vector>
//
//using namespace std;
//
//const int N = 15;
//
//vector<int> path;
//
//int n, ret;
//bool col[N];
//bool st1[N * 2];
//bool st2[N * 2];
//
//void dfs(int x)
//{
//	if (x > n)
//	{
//		ret++;
//		if (ret <= 3)
//		{
//			for (auto& e : path)
//			{
//				cout << e << " ";
//			}
//			cout << endl;
//		}
//	}
//
//	for (int y = 1; y <= n; y++)
//	{
//		if (col[y]) continue;
//		if (st1[x - y + n] || st2[x + y + n]) continue;
//
//		path.push_back(y);
//		col[y] = st1[x - y + n] = st2[x + y + n] = true;
//
//		dfs(x + 1);
//		col[y] = st1[x - y + n] = st2[x + y + n] = false;
//		path.pop_back();
//	}
//}
//
//int main()
//{
//	cin >> n;
//	dfs(1);
//	cout << ret << endl;
//	return 0;
//}

//数独
// 有误
//#include <iostream>
//#include <vector>
//
//using namespace std;
//
//const int N = 12;
//int n = 9;
//int a[N][N];
//bool row[N][N], col[N][N], st[N][N][N];
//
//bool dfs(int i, int j)
//{
//	if (j > 9)
//	{
//		i++;
//		j = 1;
//	}
//
//	if (i > 9) return true;
//	if (a[i][j]) return dfs(i, j + 1);
//
//	for (int x = 1; x <= 9; x++)
//	{
//		if (row[i][x] ||col[j][x]|| st[i/3][j/3][x]) continue;
//
//		row[i][x] = col[j][x] = st[i / 3][j / 3][x] = true;
//		a[i][j] = x;
//
//		if (dfs(i, j + 1))
//			return true;
//
//		row[i][x] = col[j][x] = st[i/3][j/3][x] = false;
//		a[i][j] = 0;
//	}
//	return false;
//}
//
//int main()
//{
//	for (int i = 1; i <= n; i++)
//	{
//		for (int j = 1; j <= n; j++)
//		{
//			cin >> a[i][j];
//			int x = a[i][j];
//			if (x)
//			{
//				row[i][x] = col[j][x] = st[i][j][x] = true;
//			}
//		}
//	}
//	
//	dfs(1, 1);
//
//	for (int i = 1; i <= n; i++)
//	{
//		for (int j = 1; j <= n; j++)
//		{
//			cout << a[i][j] << " ";
//		}
//		cout << endl;
//	}
//
//	return 0;
//}


//#include <iostream>
//
//using namespace std;
//
//const int N = 12;
//int n = 9;
//int a[N][N];
//bool row[N][N], col[N][N], st[N][N][N];
//
//bool dfs(int i,int j)
//{
//	if (j == n)
//	{
//		i++;
//		j = 0;
//	}
//	if (i == n)
//	{
//		return true;
//	}
//
//	if (a[i][j]) return dfs(i, j + 1);
//
//	for (int x = 1; x <= 9; x++)
//	{
//		if (row[i][x] || col[j][x] || st[i/3][j/3][x]) continue;
//
//		a[i][j] = x;
//		row[i][x] = col[j][x] = st[i / 3][j / 3][x] = true;
//
//		if (dfs(i, j + 1)) return true;
//		row[i][x] = col[j][x] = st[i / 3][j / 3][x] = false;
//		a[i][j] = 0;
//	}
//
//	return false;
//}
//
//int main()
//{
//	for (int i = 0; i < n; i++)
//	{
//		for (int j = 0; j < n; j++)
//		{
//			cin >> a[i][j];
//			if (a[i][j])
//			{
//				int x = a[i][j];
//				row[i][x] = col[j][x] = st[i/3][j/3][x] = true;
//			}
//		}
//	}
//
//	dfs(0, 0);
//
//	for (int i = 0; i < n; i++)
//	{
//		for (int j = 0; j < n; j++)
//		{
//			cout << a[i][j] << " ";
//		}
//		cout << endl;
//	}
//
//	return 0;
//}


#include <iostream>
#include <vector>
using namespace std;

int path;
int n, k, ret;

void dfs(int pos, int begin)
{
	if (pos == k)
	{
		if (path == n)
		{
			ret++;
		}
		return;
	}

	for (int i = begin; i <= n; i++)
	{
		if (path + i * (k - pos) > n) continue;

		path += i;
		dfs(pos + 1, i);
		path -= i;
	}

}

int main()
{
	cin >> n >> k;

	dfs(0, 1);
	
	cout << ret << endl;

	return 0;
}